/*
 * 最大乘积
 *
 * 题目链接：https://programming.pku.edu.cn/probset/c4b75386cfd8411991908475c4b91bc6/ef6b04b013a041418460f2df14868288/
 * 作者：lyazj <seeson@pku.edu.cn>
 *
 * 本题所需主要知识点：
 *   - 数学
 *
 * 如果观察到序列的全部特征，特别是周期性，可以实现 O(n) -> O(1) 的优化
 */

#include <math.h>
#include <stdio.h>

int main(void)
{
  int n;  // n >= 5
  scanf("%d", &n);

  // 可以证明，答案为 2 或 3 开头的，有最多 1 处且间隔为 2 的间断的准连续序列
  // 证明可以按照以下步骤进行：
  //   1. 证明 n >= 5 时，如果最优分解序列存在间断，间隔只能为 2（不等式）
  //   2. 证明 n >= 5 时，如果最优分解序列存在间断，只能存在 1 处间断（不等式）
  //   3. 证明 n >= 5 时，答案为 2 或 3 开头（不等式或数学归纳法）
  // 我们考虑 2, 3, ..., m 连续序列，其和为 (m + 2) * (m - 1) / 2，它到 2, 3, ..., m, m + 1 的演化过程为：
  //   [+   0] 2, 3, ..., m - 1, m
  //   [+   1] 2, 3, ..., m - 1, m + 1
  //   [+   2] 2, 3, ..., m, m + 1
  //   [+ ...] ...
  //   [+ m-2] 2, 4, ..., m, m + 1
  //   [+ m-1] 3, 4, ..., m, m + 1
  //   [+ m+0] 3, 4, ..., m, m + 2
  //   [+ m+1] 2, 3, 4, ..., m, m + 1（进入下一周期）
  // 故只需解方程 (m + 2) * (m - 1) / 2 = n 并向下取整 m，结合 n - (m + 2) * (m - 1) / 2 即可确定答案

  int m = (sqrt(8 * n + 9) - 1) / 2;
  int d = n - (m + 2) * (m - 1) / 2;
  if(d == m - 1 || d == m) {  // 3 开头
    for(int i = 3; i <= m + 1; ++i) { printf("%d ", i + (d == m && i == m + 1)); }
  } else {  // 2 开头
    for(int i = 2; i <= m; ++i) { printf("%d ", i + (m - i < d)); }
  }
  fseek(stdout, -1, SEEK_CUR);
  printf("\n");
  return 0;
}
